home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue30 / diffm133 / DIFFM133.ZIP / SOURCE / aCRC32.pas next >
Encoding:
Pascal/Delphi Source File  |  1997-12-26  |  6.7 KB  |  180 lines

  1. {***********************************************}
  2. {                                               }
  3. { CRC32 calculation V1.01                       }
  4. { Copyright (c) 1997 by S.Kurinny & S.Kostinsky }
  5. {                                               }
  6. {***********************************************}
  7.  
  8. unit aCRC32;
  9.  
  10. interface
  11.  
  12. {----------------------------------------------------------------------}
  13.  
  14. { Tests CRC algorythm. Returns true if Ok. This function is for testing
  15.   purposes only and you don't need to call it.}
  16. Function  TestCRC:Boolean;
  17.  
  18. { Finishes calculation of CRC. If you don't need compartability with PKZIP's
  19.   CRC algorythm you may not call this function.}
  20. function  CRC32Finish(CRC:Integer):Integer;
  21.  
  22. { Returns initialized CRC variable ($FFFFFFFF). CRC variable should be
  23.   initialized before calculating CRC.}
  24. function  CRC32Start:Integer;
  25.  
  26. { Calculates CRC for a given memory buffer. Buf  - memory buffer.
  27.   CRC - initial CRC value (result of previuos call to CRC32Calc or $FFFFFFFF).
  28.   BufSize - buffer size. Returns new CRC value.}
  29. function  CRC32Calc(Var Buf;CRC:integer;BufSize:Integer):Integer;
  30.  
  31. { Calculates CRC value for a given buffer. This function calls CRC32Start,
  32.   CRC32Calc,CRC32 finish internally and returns calculated CRC value.}
  33. Function  CalculateCRC32(VAR Buf;Count:Integer):Integer;
  34.  
  35. {----------------------------------------------------------------------}
  36. implementation
  37. {----------------------------------------------------------------------}
  38.  
  39. Function CalculateCRC32(VAR Buf;Count:Integer):Integer;
  40. begin
  41.   Result:=not CRC32Calc(Buf,$FFFFFFFF,Count);
  42. end;
  43.  
  44. {----------------------------------------------------------------------}
  45.  
  46. const
  47.   TestString: String[31] = 'Testing CRC32 routine ... ';
  48.   PKZIP_CRC = $6759C95B;
  49.  
  50. {----------------------------------------------------------------------}
  51.  
  52. Const
  53. aTableCRC32:Array[0..255] of integer=(
  54. {;           $}
  55.             $00000000, $77073096, $ee0e612c, $990951ba,
  56.             $076dc419, $706af48f, $e963a535, $9e6495a3,
  57.             $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
  58.             $09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91,
  59. {;            1}
  60.             $1db71064, $6ab020f2, $f3b97148, $84be41de,
  61.             $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
  62.             $136c9856, $646ba8c0, $fd62f97a, $8a65c9ec,
  63.             $14015c4f, $63066cd9, $fa0f3d63, $8d080df5,
  64. {;            2}
  65.             $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
  66.             $3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b,
  67.             $35b5a8fa, $42b2986c, $dbbbc9d6, $acbcf940,
  68.             $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
  69. {;            3}
  70.             $26d930ac, $51de003a, $c8d75180, $bfd06116,
  71.             $21b4f4b5, $56b3c423, $cfba9599, $b8bda50f,
  72.             $2802b89e, $5f058808, $c60cd9b2, $b10be924,
  73.             $2f6f7c87, $58684c11, $c1611dab, $b6662d3d,
  74. {;            4}
  75.             $76dc4190, $01db7106, $98d220bc, $efd5102a,
  76.             $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
  77.             $7807c9a2, $0f00f934, $9609a88e, $e10e9818,
  78.             $7f6a0dbb, $086d3d2d, $91646c97, $e6635c01,
  79. {;            5}
  80.             $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
  81.             $6c0695ed, $1b01a57b, $8208f4c1, $f50fc457,
  82.             $65b0d9c6, $12b7e950, $8bbeb8ea, $fcb9887c,
  83.             $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
  84. {;            6}
  85.             $4db26158, $3ab551ce, $a3bc0074, $d4bb30e2,
  86.             $4adfa541, $3dd895d7, $a4d1c46d, $d3d6f4fb,
  87.             $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
  88.             $44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9,
  89. {;            7}
  90.             $5005713c, $270241aa, $be0b1010, $c90c2086,
  91.             $5768b525, $206f85b3, $b966d409, $ce61e49f,
  92.             $5edef90e, $29d9c998, $b0d09822, $c7d7a8b4,
  93.             $59b33d17, $2eb40d81, $b7bd5c3b, $c0ba6cad,
  94. {;            8}
  95.             $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
  96.             $ead54739, $9dd277af, $04db2615, $73dc1683,
  97.             $e3630b12, $94643b84, $0d6d6a3e, $7a6a5aa8,
  98.             $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
  99. {;            9}
  100.             $f00f9344, $8708a3d2, $1e01f268, $6906c2fe,
  101.             $f762575d, $806567cb, $196c3671, $6e6b06e7,
  102.             $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
  103.             $f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5,
  104. {;            A}
  105.             $d6d6a3e8, $a1d1937e, $38d8c2c4, $4fdff252,
  106.             $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
  107.             $d80d2bda, $af0a1b4c, $36034af6, $41047a60,
  108.             $df60efc3, $a867df55, $316e8eef, $4669be79,
  109. {;            B}
  110.             $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
  111.             $cc0c7795, $bb0b4703, $220216b9, $5505262f,
  112.             $c5ba3bbe, $b2bd0b28, $2bb45a92, $5cb36a04,
  113.             $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
  114. {;            C}
  115.             $9b64c2b0, $ec63f226, $756aa39c, $026d930a,
  116.             $9c0906a9, $eb0e363f, $72076785, $05005713,
  117.             $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
  118.             $92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21,
  119. {;            D}
  120.             $86d3d2d4, $f1d4e242, $68ddb3f8, $1fda836e,
  121.             $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
  122.             $88085ae6, $ff0f6a70, $66063bca, $11010b5c,
  123.             $8f659eff, $f862ae69, $616bffd3, $166ccf45,
  124. {;            E}
  125.             $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
  126.             $a7672661, $d06016f7, $4969474d, $3e6e77db,
  127.             $aed16a4a, $d9d65adc, $40df0b66, $37d83bf0,
  128.             $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
  129. {;            F}
  130.             $bdbdf21c, $cabac28a, $53b39330, $24b4a3a6,
  131.             $bad03605, $cdd70693, $54de5729, $23d967bf,
  132.             $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
  133.             $b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d
  134. );
  135.  
  136. {----------------------------------------------------------------------}
  137. function CRC32Calc(Var Buf;CRC:integer;BufSize:Integer):Integer;assembler;
  138. asm
  139.   push esi
  140.   mov esi,Buf
  141. @1:
  142.   movzx eax,byte ptr [esi]
  143.   inc ESI
  144.   xor al,dl
  145.   shr edx,8
  146.   xor edx,dword ptr [atablecrc32+eax*4]
  147.   Loop @1
  148.   mov eax,edx
  149.   pop esi
  150. end;
  151.  
  152. {----------------------------------------------------------------------}
  153.  
  154. Function TestCRC:Boolean;
  155. Var
  156.   CRC:Integer;
  157. begin
  158.   CRC:=not CRC32Calc(TestString[1],$ffffffff,Length(TestString));
  159.   Result:=CRC=PKZIP_CRC;
  160. end;
  161.  
  162. {----------------------------------------------------------------------}
  163.  
  164. function CRC32Finish(CRC:Integer):Integer;
  165. begin
  166.   Result := not CRC;
  167. end;
  168.  
  169. {----------------------------------------------------------------------}
  170.  
  171. function CRC32Start:Integer;
  172. begin
  173.   Result := $FFFFFFFF;
  174. end;
  175.  
  176. {----------------------------------------------------------------------}
  177. end.
  178.  
  179.  
  180.